推荐关注
以下文章来源Java后端栈,回复”面试“获面试宝典
哈喽,各位新来的小伙伴们,大家好!由于公众号做了改版,为了保证公众号的资源能准时推送到你手里,大家记得将后端君的公众号 加星标置顶 ,在此真诚的表示感谢~
来源:
上一篇:Intellij IDEA 神级插件!效率提升 10 倍!
正文
大家好,我是栈哥。
最近西安一码通二次崩溃这个事情,实在是太顶了。
网上一直在说崩溃是因为后台传输的是图片?
第一次看到这个消息的时候,我是抱有怀疑态度的。毕竟大家都知道这种大的政府项目都是要招标的,能中标到项目的公司也肯定不会差,怎么会犯这么低级的错误呢?
相关文章:
1、西安一码通崩了!程序员因扫不出一码通进不了办公楼,而无法解决Bug
2、西安一码通又崩了,官方回应!
3、#西安一码通#又崩了。。。谁之责 ?
今天又在知乎上看到了知友 “卢兴民” 的回答,别人是真的去分析了二维码接口数据的,证明并不是在服务器生成图片。
西安健康码的接口数据
真正的二维码数据是 /person/app/refreshQRCode这个接口
这位知友表示:
看下这个接口返回,设计上也没有太大的问题。 主要问题集中在所有的js/css/img这些静态资源全都从从一个出口进行提供,没上CDN粗略估算了一下,js/css/img数据总共约500kB按照从某个群里得到的数据,暂且认为是准的,健康码的请求量峰值达到了3.3w qps那按照这个量估计 33000 x 500 x 8 bps ≈ 125Gbps 这个出口量级很难用单机房承载,峰值一来,出口网卡打满,直接gg。到写这个回答时,西安健康码还是没有将静态资源上CDN,之后看看访问量再起飞的时候,能不能扛得住吧。
看下这个接口返回,设计上也没有太大的问题。
主要问题集中在所有的js/css/img这些静态资源全都从从一个出口进行提供,没上CDN
粗略估算了一下,js/css/img数据总共约500kB
按照从某个群里得到的数据,暂且认为是准的,健康码的请求量峰值达到了3.3w qps
那按照这个量估计 33000 x 500 x 8 bps ≈ 125Gbps 这个出口量级很难用单机房承载,峰值一来,出口网卡打满,直接gg。
到写这个回答时,西安健康码还是没有将静态资源上CDN,之后看看访问量再起飞的时候,能不能扛得住吧。
还有一位知友 “知乎用户xv4Ddk” 就更详细了,扒证据的详细步骤都写出来了。
知乎回答原文如下:
1、想直接抓 HTTP 包
惦记通过 PC 微信打开「西安市民一码通」抓个包,结果发现「个人电子码」注册时需要以西安的地址注册
常住或临时地址都只能选择西安的区/县
怕万一给我健康码搞红了,所以没敢继续……
简单的路走不通,只能换一条复杂点的
2、那就看看这个小程序咋写的吧
因为自己是苹果手机,于是找出之前用过的安卓模拟器(为啥不是虚拟机?因为我电脑里没有 Android Studio 之类…)
我真的不是拿这个(安卓模拟器)玩游戏,我发誓……
具体步骤
在安卓模拟器登微信小号,打开大号转发来过来的「西安市民一码通」小程序。关注Java后端栈
然后找到此路径下的新增文件(*.wxapkg)
Wxapkg就是缓存到本地的微信小程序包
把它们拷到电脑上,用一个叫「wxappUnpacker」的东西解包,拿到微信小程序源代码
解包出来的小程序源代码
从源码的 pages\index\index.wxml 中找到了个人电子码,及其绑定的点击事件「onElectronCode」,进而跟踪到「onYmtLogin」->「toYmtLink」-> 「toElectronCode」。另外搜索公众号Java架构师技术后台回复“Spring”,获取一份惊喜礼包。
找到了一码通的地址,原来是小程序打开外部网页
其中
N = getApp(),
从源码的 app-service.js 中,找到 globalData.ymtUrl 的值
拼接出完整 URL(就是参数不全),浏览器访问了一下
然后发现了 qrcode.js,在里面找到了「personCodeShow」->「qrcodeColour」
function qrcodeColour(e, t, a, o) {
var s = baseUrl + "/view/login.html?code=" + t
, i = 300
, r = 300
, n = i
, d = r
, p = 80
, l = 80
, c = (i - p) / 2
, u = (r - l) / 2
, m = $(e).qrcode({
render: "canvas",
text: s,
width: i,
height: r,
background: "transparent",
foreground: a
})
, g = m.find("canvas").get(0)
, C = new Image;
C.src = g.toDataURL("image/png"),
C.onload = function() {
g.width = n,
g.height = d;
var e = g.getContext("2d");
e.fillStyle = "#ffffff",
e.fillRect(0, 0, g.width, g.height),
e.drawImage(C, 0, 0);
var t = new Image(p,l);
t.src = o,
t.onload = function() {
e.drawImage(t, c, u, p, l)
}
最终结果:没有在服务端生成二维码图片!
相关链接
https://www.zhihu.com/question/509914161/answer/2299099095
https://www.zhihu.com/question/509914161/answer/2299646933
最后给读者整理了一份BAT大厂面试真题,需要的可扫码加微信备注:“面试”获取。
◆ ◆ ◆ ◆ ◆
字节跳动面试经验总结,已顺利拿到offer!
IntelliJ IDEA这样配置,代码效率嗖嗖的~
Intellij IDEA 2021.2.3 最新版免费激活教程(可激活至 2099 年,亲测有效)
分享一个牛逼的 Java 开源后台管理系统,不要造轮子了!
硬核!一套基于SpringBoot + Vue 的开源物联网智能家居系统(附源码)!
基于 SpringBoot2 + MybatisPlus 的商城管理系统(附源码)
if(a==1 && a==2 && a==3),为true,你敢信???
很佩服的一个Google大佬,离职了。。
HTTP Host 头攻击
两次绩效被打3.25B,员工将支付宝告上了法院,判了
西安一码通又崩了,官方回应!
欢迎添加栈哥个人微信 ysle007 进粉丝群或围观朋友圈
扫码关注带你吊爆Java后端技术
文章有问题?点此查看未经处理的缓存